package com.chengdu.chun.controller;

import com.chengdu.chun.po.Loginfo;
import com.chengdu.chun.po.User;
import com.chengdu.chun.service.*;
import com.chengdu.chun.util.MD5Utils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.servlet.ModelAndView;

import javax.servlet.http.HttpSession;
import java.util.List;

@Controller  // 定义当前类是一个控制器（注意：它实际上是springmvc中的处理器）
@RequestMapping("/user")    // 定义当前类中方法的访问的一个前缀
public class UserController {

    /**
     * 注解模式注入了业务逻辑层的对象（通常是接口）
     */
    // 类的属性模式，自动注入，当前类中都可以使用
    @Autowired
    private HttpSession session;
    @Autowired
    private UserService userService;
    @Autowired
    private LoginfoService loginfoService;
    @Autowired
    public ClassesService classesService;
    @Autowired
    public StudentService studentService;
    @Autowired
    public RoomService roomService;


    /**
     * 功能实现方法：登陆
     *
     * @param name 请求参数（post的表单参数）
     * @param pass 请求参数（post的表单参数）
     * @return
     * @RequestMapping注解（value匹配访问的url路径，注意需要添加上类中的附加路径； method对应请求的方式，当前只对应post请求）
     */
    @RequestMapping(value = "/login", method = {RequestMethod.POST})
    // 可以在Controller的方法中添加参数”HttpSession session“，则session对象被自动引入，只能当前方法使用
    public ModelAndView login(String name, String pass) {
        // 创建模型和视图对象
        ModelAndView mv = new ModelAndView("redirect:/user/main");
//        跳转到业务逻辑层去进行数据处理
        User user = userService.login(name, pass);
        System.out.println("用户信息: " + user);
        if (user == null) {
            mv.addObject("errinfo", "用户名或密码不正确！！！");
            mv.setViewName("err");
            // 可以重定向到静态页面
//            mv.setViewName("redirect:/loginfail.html");
        } else {
//            addObject 方法相当于将对象放到request当中，只能当前使用，不能持续
//            mv.addObject("user", user);
            session.setAttribute("user", user);
        }

        return mv;
    }

    @RequestMapping("/main")
    public String main(Model model) {
        // 如果ModelAndView对象中没有定义view视图的名称，则自动将请求的url地址作为视图路径名称来使用
        //   比如我的请求地址为  /user/main，则当前项目中的当前方法去默认查找的jsp路径为  /WEB-INF/view/user/main.jsp

        // 获取操作日志记录
        List<Loginfo> loginfoList = loginfoService.getLoginfoList();
        model.addAttribute("loginfoList", loginfoList);

        // 根据不同权限的用户来进行相关信息的查询
        User user = (User) session.getAttribute("user");
        if (user.getTypeid() == 1) { // 班主任查询班级数量和班级里的学生总数
            user.setClassesnum(classesService.selectCountByteacher(user.getUid()));
            user.setStudentnum(studentService.selectStudentCountByTeacher(user.getUid()));
        } else if (user.getTypeid() == 2) { // 宿舍数量和宿舍里的学生总数
            user.setRoomsnum(roomService.selectCountRoom(1));
            user.setStudentnum(studentService.getStudentCountByroomTeacher());
        }
        System.out.println("信息: " + user);
        session.setAttribute("user", user);
        return "main";
    }

    @GetMapping("/updatepasswordpage")
    public String updatepasswordpage(Model model) {
        if (judguUser()) return "redirect:/login.html";
        return "updatepassword";
    }


    @PostMapping("/updatepassword")
    public String updatepassword(Model model, String cpassword, String npassword) {
        if (judguUser()) return "redirect:/login.html";
        User user = (User) session.getAttribute("user");
        System.out.println("存储密码: " + user.getPass());
        System.out.println("当前输入密码: " + MD5Utils.reMD5(cpassword));
        if (!(user.getPass().equals(MD5Utils.reMD5(cpassword)))) {
            model.addAttribute("err", "当前密码输入错误...");
            return "updatepassword";
        }

        if (userService.updatePassword(user.getUid(), npassword)) return "redirect:/login.html";

        model.addAttribute("errinfo", "修改密码失败！！！");
        return "err";
    }

    @GetMapping("/logout")
    public ModelAndView logout() {
        if (session.getAttribute("user") != null) {
            session.invalidate();
        }
        return new ModelAndView("redirect:/login.html");
    }

    private boolean judguUser() {
        if (session.getAttribute("user") == null) {
            return true;
        }
        return false;
    }


}
